package wili.attrMapping.core;

import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;

/**
 * 属性集定义：对象名、属性集、类型函数、键。
 * 
 * @author weila 2022年10月15日
 */
public abstract class AttsDefine {
	
	public final Object bean = null;
	public UserConf conf;

	/**
	 * 文件中，对于具体属性序列，在代码上下文中或有一个key值以确定其唯一性。<br>
	 * 若 keyName为空，表示无名。
	 */
	public final String keyName;
	/**
	 * 属性所在的对象名（若各属性分散存在，其在源文件中未必能对应到一个真实的对象名）
	 */
	public final String objName;
	/**
	 * 目标属性名（暂不考虑有多个属性的情形）
	 */
	public final String targetAtt;
	/**
	 * 属性名序列
	 */
	public final List<String> attNames;

	public boolean isNewAtt;

	public String toString() {
		return objName + attNames.toString();
	}

	public AttsDefine(boolean isNewAtt, String keyName, String objName, String targetAttName) {
		this.targetAtt = targetAttName;
		this.isNewAtt = isNewAtt;
		this.keyName = keyName;
		this.objName = objName;
		this.attNames = new ArrayList<>(Stream.of(this.getClass().getDeclaredFields())
				.filter(fd -> Modifier.isPublic(fd.getModifiers())).map(fd -> fd.getName()).toList());
		Collections.sort(this.attNames);// should sort by name+kind later.
	}

	/**
	 * 根据规则和旧属性生成新属性值。
	 */
	public abstract String valueOfNewAtt(String ruleValue, Atts oldAtts);

	/**
	 * 类型值是规则表中的值
	 */
	public abstract String valueKindOfAtt(String att, String value);

}
